import math
import cmath
import unittest

class NoEsFuncionCuadratica(Exception):
    pass

    
def operaciones (a,b,c, numero):
	# Proposito = Denota las raices de un numero
	# Precondicion = El tipo de datos de entrada debe de ser un numero.
    # PostCondicion = Va a devolver una tupla con las dos raices racionales.
	primer_raiz = (-1 * b + numero) / (2 * a)
	segunda_raiz = (-1 * b - numero) / (2 * a)
	raices = (primer_raiz,segunda_raiz)
	return raices
	
def buscar_raices_complejas(a,b,c,numero) :
	# Proposito = Denota una raiz compleja
	# Precondicion = No tiene.Funcion Total.
    # PostCondicion = Va a devolver una tupla con las dos raices complejas .
	raiz_complejo = complex(math.sqrt(-1 * numero),1j)
	complejo = operaciones(a,b,c,raiz_complejo)
	return complejo


def buscar_raices(a, b, c):
    # Proposito = Toman los coeficientes a, b y c de una funcion cuadratica y busca
    # sus raices. La funcion cuadratica es del estilo: ax**2 + b x + c = 0
	# Precondicion = El tipo de datos de entrada debe de ser un numero.
    # PostCondicion = Va a devolver una tupla con las dos raices donde la primer raiz va a ser
    # menor o igual que la segunda raiz.
    
    if a == 0:
        raise NoEsFuncionCuadratica()

    discriminante = b * b - 4 * a * c
    if discriminante < 0 :raices = buscar_raices_complejas(a,b,c,discriminante)
    else :raices = operaciones(a,b,c,math.sqrt(discriminante))
    return (raices)



class TestPolinomio(unittest.TestCase):

    def test_buscar_raices(self):
        COEFICIENTES_RAICES = [
            ((1,0,0), (0, 0)),
            ((-1,1,2), (-1, 2)),
            ((-1,0,4), (-2, 2)),
        ]
        for coef, raices_esperadas in COEFICIENTES_RAICES:
            raices = buscar_raices(coef[0], coef[1], coef[2])
            self.assertEquals(raices, raices_esperadas)


    def test_no_es_cuadratica(self):
        self.assertRaises(NoEsFuncionCuadratica, buscar_raices, 0, 2, 3)


if __name__ == '__main__':
    unittest.main()
	
